package com.mf.service.impl;

import cn.hutool.http.HttpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mf.config.GlobalParameter;
import com.mf.entity.Code;
import com.mf.entity.Positions;
import com.mf.mapper.CodeMapper;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;

import com.mf.service.ICodeService;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mf.vo.positions.PositionsVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
* <p>
    * 股票代码表 服务实现类
    * </p>
*
* @author mf
* @since 2024-06-01
*/
@Service
public class CodeServiceImpl extends ServiceImpl<CodeMapper, Code> implements ICodeService {
    @Resource
    private CodeMapper codeMapper;
    /**
     * 查找所有状态为1的代码信息。
     * 使用LambdaQueryWrapper构造查询条件，以获取所有状态为1的Code实体列表。
     * @return List<Code> - 所有状态为1的代码实体列表。
     */
    @Override
    @Transactional
    public List<Code> findAll() {
        final LambdaQueryWrapper<Code> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Code::getStatus, 1);
        wrapper.notLike(Code::getDm, "688");
        wrapper.notLike(Code::getDm, "689");
        wrapper.notLike(Code::getMc, "退");
        wrapper.notLike(Code::getMc, "ST");
        return codeMapper.selectList(wrapper);
    }

    /**
     * 根据持仓数据获取
     * @param positionsDetail 持仓数据
     * @return List<Code> - 持仓数据对应的代码实体列表。
     */
    @Override
    public List<PositionsVo> findDmList(List<Positions> positionsDetail) {
        List<String> dmList = positionsDetail.stream().map(Positions::getDm).toList();
        return codeMapper.findDmList(dmList);
    }

    /**
     * 获取指定股票代码后的所有代码
     * @param dm 代码
     * @return List<Code> - 定股票代码后的所有代码实体列表。
     */
    @Override
    @Transactional
    public List<Code> findAll(String dm) {
        final List<Code> codeList = findAll();
        if(dm == null || dm.isEmpty()){
            return codeList;
        }
        List<Code> newCodeList = new ArrayList<>();
        boolean flag = false;
        for (Code code : codeList) {
            if (code.getDm().equals(dm)) {
                flag = true;
                newCodeList.add(code);
                continue;
            }
            if (flag) {
                newCodeList.add(code);
            }
        }
        return newCodeList;
    }

    /**
     * 获取api上所有股票代码
     */
    @Override
    @Transactional
    public List<Code> updateCode() {
        System.out.println("2");
        String jsonString = HttpUtil.get(GlobalParameter.ALL_CODE_LIST + GlobalParameter.LICENCE);
        JSONArray jsonArray = new JSONArray(jsonString);
        List<Code> listCode = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            // 将Object转换为JSONObject以访问其内部的键值对
            final JSONObject obj = jsonArray.getJSONObject(i);
            Code code = new Code();
            code.setDm(obj.getStr("dm"));
            code.setMc(obj.getStr("mc"));
            code.setJys(obj.getStr("jys"));
            // 查询代码中是否有 退 或者 ST 字符串
            if (code.getMc().contains("退") || code.getMc().contains("ST")) {
                code.setStatus(0);
            } else {
                code.setStatus(1);
            }
            listCode.add(code);
            System.out.println(code.toString());
        }
        return listCode;
    }
}
